//进程等待
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main()
{

    //进程程序替换
    pid_t id = fork();
    if(id < 0){
        perror("fork fail\n");
    }
    else if(id == 0){
        //子进程
        printf("i am child process, pid =  %d\n",getpid());
        //子进程执行ls -a 命令
        //execl("/usr/bin/lsl","ls","-l",NULL);
        //子进程执行ls -l命令
        //execlp("ls","ls","-l",NULL);
        
        // 设置新程序的环境变量
        // char *envp[] = {"MY_VARIABLE=value", NULL};
        // // 使用 execle 函数替换当前进程的程序
        // execle("/bin/echo", "echo", "Hello, execle!", (char *)NULL, envp);

        char *const argv[] = {"ls","-l",NULL};
        execv("/usr/bin/ls",argv);
        printf("exec end\n");
        exit(1);
    }
    else{
        //父进程
        int status = 0;
        pid_t  ret = waitpid(id,&status,0);//阻塞等待指定子进程
        //printf("WIFEXITED(status) = %d\n",WIFEXITED(status));
        if(WIFEXITED(status) && ret == id)//等待成功
        {
            printf("wait sucess,child return code = %d,ret = %d, id = %d\n",WEXITSTATUS(status),ret,id);
        }
    }





    //waitpid非阻塞等待
    // pid_t id = fork();
    // pid_t child_id = 0;
    // if(id < 0 ){
    //     perror("fork\n");
    //     exit(-1);
    // }
    // else if(id == 0){
    //     child_id = getpid();
    //     printf("i am child process. pid = %d\n",child_id);
    //     sleep(3);
    //     exit(1);
    // }
    // else {
    //    printf("parent process waiting ...\n");
    //    int status = 0;
    //    pid_t ret  = 0;
    //    do
    //    {
    //         ret = waitpid(child_id,&status,WNOHANG);//非阻塞等待任意子进程
    //         if(ret == 0){//子进程还没退出，父进程非阻塞等待可以做其他事情
    //             printf("child process is running,parent do other things\n");
    //             sleep(1);
    //         }
    //    }while(0 == ret);
    //    //等待成功
    //    if(WIFEXITED(status) && ret == id){
    //     printf("wait sucess,child return code = %d,ret = %d\n",WEXITSTATUS(status),ret);
    //    }
    //    //等待失败
    //    else{
    //     printf("wait fail\n");
    //    }
    // }




    // //waitpid阻塞等待
    // pid_t id = fork();
    // if(id < 0 ){
    //     perror("fork\n");
    //     exit(-1);
    // }
    // else if(id == 0){
    //     printf("i am child process. pid = %d\n",getpid());
    //     sleep(3);
    //     exit(1);
    // }
    // else {
    //    printf("parent process waiting ...\n");
    //    int status = 0 ;
    //    pid_t ret = waitpid(-1,&status,0);//阻塞等待任意子进程
      
    //    if(WIFEXITED(status) && ret == id){
    //     printf("wait sucess,child return code = %d,ret = %d\n",WEXITSTATUS(status),ret);
    //    }
    //    else{
    //     printf("wait fail\n");
    //    }
    // }




//     pid_t id = fork();
//    if(id < 0 )
//    {
//     perror("fork\n");
//    }
//    else if(id == 0){
//     //子进程
//     printf("i am child process.pid = %d\n",getpid());
//     //子进程退出 退出码为1 
//     exit(1);
//    }
//    else{
//      //父进程
//     printf("i am Parent process waiting...\n");
//     sleep(3);//父进程等待三秒后回收子进程
//     int status = 0;
//     pid_t waitid = wait(&status);//不想获取子进程退出码可以设置为NULL
//     //等待失败处理
//     if(waitid == -1)
//     {
//         perror("wait fail\n");
//         exit(-1);
//     }
//     printf("wait sucess， child excit code = %d,waitid = %d\n",(status>>8)&0xFF,waitid);
//    }
    return 0;
}